干货分享 | R-ggplot2-如何在时空尺度展示各省份的兴趣数据
0. 问题导入
在我们日常处理地理数据过程中,我们不只单单需要对栅格文件进行空间绘图。同样地,我们也需要根据省份的位置信息对各省的兴趣数据进行空间展示?那么,具体应该怎么实现呢?
本篇以“安徽、江苏、浙江及上海四省市2000-2018年人口MMK趋势值的空间尺度展示”为例,具体给出解决方案~
1. 示例数据
点击下方链接完成示例数据下载,并需要根据setwd()设置默认路径至20200103文件夹下。
setwd('/Users/jerseyshen/Documents/JianShu_Project/20200103')
点击下方链接下载示例各省shp及人口csv数据(https://pan.baidu.com/s/1DaWPcaepNHLCFEHlw2xdqg)
2. 导入示例数据
2.1 合并并导入四省示例人口数据(csv)
pop_list = as.list(list.files('data/',full.names = T))
pop_read = lapply(pop_list, fread)
predel_data <-function(x){
x = x[,-c(1:2)]
x = apply(x, 1, rev)
colnames(x) = c('total','urban','rural')
rownames(x) = paste0('year',2000:2018)
return(x)
}
pop_reframe = lapply(pop_read,predel_data)
pl_bar_df = data.frame(
Date = 2000:2018,
Anhui = pop_reframe[[1]][,1],
JiangShu = pop_reframe[[2]][,1],
Shanghai = pop_reframe[[3]][,1],
Zhejiang = pop_reframe[[4]][,1]
)
pl_bar_m = melt(pl_bar_df,'Date')
2.2 合并并导入四省示例shp文件
library(sf)
shp_file = as.list(list.files('shp/',pattern = '.shp$',
full.names = T))
shp_list = lapply(shp_file, shapefile)
shp_bind = do.call(bind,shp_list)
3. 计算各省人口时间MMK趋势值
具体关于如何计算MMK趋势值的方法请参考:
R-Modified Mann-Kendall 趋势分析(改进后MK趋势分析)
mk_df = pl_bar_df[,-1]
mk_df = as.matrix(mk_df)
source('~/Documents/JianShu_Project/20191209/mmkTrend.R')
mk_cal <- function(x){
temp_mk = mmkTrend(x)$Zc
return(temp_mk)
}
mk_v = apply(mk_df, 2,mk_cal)
4. 将四省shp文件合并为一个shp文件
shapefile(shp_bind,'roi2.shp')
shp_m = shapefile('roi2.shp')
5. 将合并后的shp文件转为绘图用的data.frame
shp_df = fortify(shp_m)
6. 给各省shp添加MMK趋势值属性
g1 = which(shp_df$id == 0)
g2 = which(shp_df$id == 1)
g3 = which(shp_df$id == 2)
g4 = which(shp_df$id == 3)
shp_df$MK = mk_v[1]
shp_df$MK[g2] = mk_v[2]
shp_df$MK[g3] = mk_v[3]
shp_df$MK[g4] = mk_v[4]
7. 绘制各省2000-2018年人口演进趋势值空间分布图(图1)
mycolor = colorRampPalette(brewer.pal(11,'RdYlBu'))(4)
p1
= ggplot()+
geom_polygon(data = shp_df,aes(x = long,y = lat,group = group,fill = MK),
color = 'white')+
scale_fill_gradientn(colours = mycolor)+
coord_fixed(1.3)+
theme_nothing()+
theme(legend.position = 'bottom',
legend.key.width = unit(1.3,'cm'),
legend.text = element_text(face='bold',colour='black',size=12,hjust=.5),
legend.title = element_text(face='bold',colour='black',size=12,hjust=.5))
png('plot1.png',
height = 10,
width = 10,
units = 'cm',
res = 800)
print(p1)
dev.off()
图1 各省2000-2018年人口演进趋势值空间分布图
在完成图1绘制,本篇的第一个小目标就完成了。但是呢,是不是还缺点什么?
是的,单纯基于MMK趋势值,我们智能看到浙江,江苏,上海与安徽四省市在2000年-2018年间压缩后的一个趋势,期间每年具体的人口数我们无法获取信息。
因此,本篇第二个目标就是增加绘制各省2000-2018年人口的时间演进图,并与空间图进行拼接。
8. 绘制各省2000-2018年人口堆叠时间演进子图(图2)
pl_bar_m$variable = factor(pl_bar_m$variable,
levels = c('Shanghai',
'Zhejiang',
'Anhui','JiangShu'))
p2 = ggplot()+
geom_bar(data = pl_bar_m,
aes(x = Date, y = value, fill = variable),
stat = 'identity',
position = 'dodge',
width = 0.5)+
theme_bw()+
theme(
legend.position = 'top',
axis.text = element_text(face='bold',colour='black',size=12,hjust=.5),
axis.title = element_text(face='bold',colour='black',size=12,hjust=.5),
legend.text = element_text(face='bold',colour='black',size=12,hjust=.5),
legend.title = element_blank(),
legend.direction = c('horizontal')
)+
guides(fill = guide_legend(nrow = 1))+
xlab('Date')+
ylab('Population')+
facet_wrap(~variable,nrow = 4,scales = 'free_y')
png('plot2.png',
height = 10,
width = 10,
units = 'cm',
res = 800)
print(p2)
dev.off()
图2 各省2000-2018年人口堆叠时间演进子图
9. 空间图与统计子图拼接(图3)
说说为啥不用facet, 因为两幅图均存在fill 属性,时间统计的fill 是离散的,对应各个省份;空间图fill属性是连续的,对应各省份的MMK趋势值。如果通过facet_wrap 进行拼接,则会出现报错。因此,本篇采用plot_grid 函数将两图进行拼接。
p3 = plot_grid(p2,p1,
rel_heights = c(3,6),
rel_widths = c(3,6),
align = 'h',
axis = 'b',
ncol = 2)
png('plot3.png',
height = 22,
width = 22,
units = 'cm',
res = 800)
print(p3)
dev.off()
图3 空间图与统计子图拼接
10. 总结
本篇共解决了以下两个问题:
1. 如何不同于栅格数据,在R中绘制省级单位尺度特定属性的空间分布图?
2. 如何在统计图与空间图均存在fill 属性时,在R中将统计图与空间图进行拼接?
11. 本篇所使用的R-packages(没有的需要通过install.packages('')进行安装)
library(data.table)
library(ggplot2)
library(maptools)
library(raster)
library(dplyr)
library(reshape2)
library(cowplot)
library(RColorBrewer)
library(ggmap)
12. 作者联系方式
如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信作者,二维码如下
文章来源于简书,作者为TroyShen,经作者授权转载,版权归原作者所有。
排版整理:梅换
3 会议报道 | 第三届人文与经济地理青年论坛主会场全景回顾
喜欢就点个在看嘛~